package negocio;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;
import java.util.Timer;
import negocio.Animado.Natureza;
import persistencia.ScoreDAO;

/*
 * Classe com o repositório dos elementos e lógica do jogo
 */
public class Jogo {
    Timer timer;
    private IJogador jogador;
    public ArrayList<Animado> desenhos = new ArrayList<Animado>();
    
    ScoreDAO db = new ScoreDAO();
    
    private int status; // 0-pausado, 1-andamento, 2-terminado
    private int largura, altura;
    private Random r = new Random();
    
    public Jogo(int largura, int altura) throws IOException{
        this.largura = largura;
        this.altura = altura;
        this.status = 0;
    }
    
    public ArrayList<Animado> getDesenhos() {
        return desenhos;
    }

    /*
     * Inicia uma nova partida com os personagens indicados
     */
    
    public void novaRodada() {
        desenhos.clear();
        jogador = new RoboControlado(this, 300, 10, Natureza.VOADOR);
        desenhos.add((Animado)jogador);
        
        desenhos.add(new RoboInimigo2(this, 0, 1, Natureza.VOADOR));
        desenhos.add(new Box(this, 320, 350, Natureza.CHAO));
        desenhos.add(new Box(this, 40, 350, Natureza.CHAO));
        desenhos.add(new Box(this, 80, 50, Natureza.CHAO));
        desenhos.add(new Box(this, 120, 350, Natureza.CHAO));
        desenhos.add(new Box(this, 160, 200, Natureza.CHAO));
        desenhos.add(new Box(this, 200, 70, Natureza.CHAO));
        desenhos.add(new Box(this, 240, 300, Natureza.CHAO));
        desenhos.add(new Box(this, 280, 380, Natureza.CHAO));
        desenhos.add(new Box(this, 360, 100, Natureza.CHAO));
        desenhos.add(new Box(this, 400, 200, Natureza.CHAO));
        desenhos.add(new Box(this, 440, 90, Natureza.CHAO));
        desenhos.add(new Box(this, 480, 300, Natureza.CHAO));
        desenhos.add(new Box(this, 520, 70, Natureza.CHAO));
        desenhos.add(new Box(this, 560, 150, Natureza.CHAO));
        

        status = 1;
        
    }
    
    
    /*
     * É chamado várias vezes durante a execução do jogo para realizar cada
     * fração de movimento, detectar colizões e executar a lógica do jogo
     */
    public void realizaJogada() {
        
        for(int x = 0; x < desenhos.size(); x++){
            desenhos.get(x).atualiza();
        }
        for(int x = 0; x < desenhos.size(); x++){
            for(int y = x+1; y < desenhos.size(); y++){
                if(desenhos.get(x).getRetangulo().intersects(desenhos.get(y).getRetangulo())){
                    desenhos.get(x).colidiuCom(desenhos.get(y));
                    desenhos.get(y).colidiuCom(desenhos.get(x));
                    
                }
            }
            
        }
        //COLETROR DE LIXO
        for(int x = 0; x < desenhos.size(); x++){
            if(desenhos.get(x).estahMorto())
                desenhos.remove(desenhos.get(x));
        }
        logicaDoJogo();
        
        //System.out.println((int)jogador.getRetangulo().getX()+" - "+(int)jogador.getRetangulo().getY());
        //ystem.out.println(desenhos.size());
        //System.out.println(jogador.getPoder());
    }

    /*
     * Na ocorrência de colisões: pontua o jogador, muda a posição do inimigo e
     * detecta o final do jogo
     */
    public void logicaDoJogo() {
        if (r.nextInt(100) % 50 == 0) {
            if(jogador.getPontuacao()<2000){
                desenhos.add(new RoboInimigo(this, r.nextInt(this.largura), r.nextInt(this.altura), Natureza.VOADOR));
            }else{
                desenhos.add(new RoboInimigo3(this, r.nextInt(this.largura), r.nextInt(this.altura), Natureza.VOADOR));
            }
        }else if(r.nextInt(100) % 100 == 0){
            desenhos.add(new BonusVida(this, r.nextInt(this.largura), r.nextInt(this.altura), Natureza.FANTASMA));
        }else if(r.nextInt(200) % 200 == 0){
            desenhos.add(new BonusPoder(this, r.nextInt(this.largura), r.nextInt(this.altura), Natureza.FANTASMA));
        }
        
        if(jogador.getVida() == 0){
            status = 2;
        }
    }

    public IJogador getJogador() {
        return jogador;
    }

    public int getStatus() {
        return status;
    }

    public int getAltura() {
        return altura;
    }

    public int getLargura() {
        return largura;
    }
    public void addScore(String nomeJogador) throws IOException{
        db.incluir(new Score(nomeJogador,jogador.getPontuacao()));
    }
    
}
